package com.tedu.api.ee;

import org.junit.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * Java有一套完整异常处理操作：
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象！
 * <p>
 * Throwable顶级超类----抛出错误：
 * 子类：Exception 对象：程序级别的错误（经常遇见）
 * 编译期---FileOutputStream(编写代码同时，，下方波浪线)
 * 处理方法：①：抛出异常：不管什么错误：抛出方法外
 * ②：捕获异常：抓到异常，记录异常错误
 * 检查异常：通常由编译器检查出来，存在异常类，抛出、捕获
 * 运行期--控制台(IDE开发工具控制台，显示出红色)
 * 非检查异常：RuntimeException(认为所有的异常来自与RuntimeException)
 * 所有的异常都是RuntimeException的子类！
 * 子类：Error对象：描述系统级别的错误(不常见)
 * --测试：程序挂了！  利用字符串不断拼接--Error
 * String  str="字符串";     直接量写出字符串    ----存常量池
 */
public class EE {
    //Error错误----递归方式栈溢出
    //1.创建静态方法 method
    //2.在静态方法中调用method
    //3.通过testError单元测试--调用EE对象下的method方法
    @Test
    public static void method() {
        method();
    }

    @Test
    public void testError() {
        EE.method();
    }

    //Exception  检查异常    ---处理手段2：捕获方式

    /**
     * 捕获异常语法：
     * try{可能出现的异常代码段中添加
     * }catch（异常名字【小异常】 e）{
     * e.printStackTrace（）;  打印异常信息--
     * 方便开发者查询原因
     * }catch（异常名字【中异常】 e）{
     * e.printStackTrace();
     * }catch(异常名字【大异常】 e){
     * e.printStackTrace();
     * }finally{
     * 捕获异常----必须执行代码块儿--IO关闭流
     * }
     * <p>
     * 捕获异常快捷键： ctrl+alt+t     选中可能出现错误的代码块儿
     */
    @Test
    public void testException() {
        try {
            String s = null;
            s = "a";
            //StringIndexOutOfBoundsException异常---产生原因：字符串下标越界异常
            //异常产生原因：指定下标超出字符串范围
            //System.out.println(s.charAt(0));
            s.charAt(0);

            s.length();
            //NullPointerException异常---空指针异常
            //异常原因：字符串为空，拿到数据值为空时

            //NumberFormatException异常----数值转换异常
            //异常产生原因：将存储的不是整数的字符串，转换为整数！
            //a  是整数类型
            Integer.parseInt(s);
        } catch (NumberFormatException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        } catch (NullPointerException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        } catch (StringIndexOutOfBoundsException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        } finally {
            System.out.println("一直执行代码块");
        }
    }

    //练习：写出程序的五个错误【分开：一次抓一个错误】，使用try--catch
//提示：字符串、集合中、标准IO、包装类
    public class Main1 {
        public void main(String[] args) throws FileNotFoundException {
            String s = "Hello";
            char ch = s.charAt(5);

            int[] arr = {1, 2, 3};
            int num = arr[3];

            String str = null;
            System.out.println(str.length());

            Object obj = "Hello";
            int n = (int) obj;

            File file = new File("不存在文件路径");
            FileReader reader = new FileReader(file);
        }
    }
}

